import router from "./router";
import store from "./store";
import { Message } from "element-ui";
import NProgress from "nprogress"; // progress bar
import "nprogress/nprogress.css"; // progress bar style
import { getToken } from "@/utils/auth"; // get token from cookie
import getPageTitle from "@/utils/get-page-title";

NProgress.configure({ showSpinner: false }); // NProgress Configuration

const whiteList = ["/login"]; // no redirect whitelist

router.beforeEach(async (to, from, next) => {
  // start progress bar
  NProgress.start();

  // set page title
  document.title = getPageTitle(to.meta.title);

  // determine whether the user has logged in
  const hasToken = getToken();

  //如果token存在
  if (hasToken) {
    //token存在了还访问登录界面,就跳转到首页去
    if (to.path === "/login") {
      next({ path: "/" });
      NProgress.done();
    }
    //token存在并且访问的不是登录地址
    else {
      //获取用户名
      const hasGetUserInfo = store.getters.name;
      //用户名存在
      if (hasGetUserInfo) {
        //放行
        next();
      }
      //用户名不存在,说明token过期了或者被删除了
      else {
        try {
          //发送请求获取并存储用户信息
          await store.dispatch("user/getInfo");
          //用于是动态添加的路由,所以这里应该修改
          // next();
          //改为这个
          next({ ...to });
          //或者
          // next({...to,replace:true});
        } catch (error) {
          //发生错误
          //移除token信息(不移除这个全局前置守卫就是死循环!)
          await store.dispatch("user/resetToken");
          //弹出信息框
          Message.error(error || "Has Error");
          //跳转到登录页面
          next(`/login?redirect=${to.path}`);
          NProgress.done();
        }
      }
    }
  } else {
    //如果用户访问的是登录界面,放行
    if ("/login" == to.path) {
      next();
    }
    //用户访问的不是登录界面,跳转到登录界面并携带跳转之前的网址
    //这样子当用户登录成功后就可以跳转到用户之前想去的网址
    else {
      next(`/login?redirect=${to.path}`);
      NProgress.done();
    }
  }
});
